package LeetCode75;

/**
 * 283. 移动零
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 *
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 *
 *
 *
 * 示例 1:
 *
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 示例 2:
 *
 * 输入: nums = [0]
 * 输出: [0]
 *
 *
 * 提示:
 *
 * 1 <= nums.length <= 104
 * -231 <= nums[i] <= 231 - 1
 */
public class T0328_移动零 {
    //直接将非零元素向前移动 后面空余的全部用0填充  使用快慢指针(双指针) 快指针寻找非0元素 慢指针指向重新排序的数组末尾
    public void moveZeroes(int[] nums) {

        int left = 0;
        int right = 0;

        while (right < nums.length) {

            //快指针找到一个个非零的元素 放到新数组后面 指针都向后移动1位
            if (nums[right] != 0) {
                nums[left] = nums[right];
                left++;
                right++;
            } else {
                //快指针找到一个元素为0  直接跳过即可
                right++;
            }

        }

        //将数组后面的位置全部用0填充
        for (int i = left; i < nums.length; i++) {
            nums[i] = 0;
        }

    }
}
